/**
 * 前端和后端思维方式一样的
 *
 * 业务对象 非常重要
 * 前端较重
 * theme、banner、spu、sku、address、user 都是业务对象
 */
import {Http} from "../utils/http";

class Theme {
    static locationA = 't-1'
    static locationE = 't-2'
    static locationF = 't-3'
    static locationH = 't-4'
    themes = []

    async getThemes() {
        const names = `${Theme.locationA},${Theme.locationE},${Theme.locationF},${Theme.locationH}`
        this.themes = await Http.request({
            url: `theme/by/names`,
            data: {
                names
            }
        })
    }

    /*
  * 大局观
  * 业务命名
  *   1、按照顺序
  *   2、top 不合适
  *   3、从上到下 按照编号 推荐ABC
  *   4、业务命名也不合适
  * 获取首页 Home 的 A 信息
  * */
    getHomeLocationA() {
        return this.themes.find(t => t.name === Theme.locationA)
    }

    /**
     * 减少请求次数
     * 每一个数据 发送一次 HTTP 请求
     *    用户量少，那么没什么大问题，如果用户量多，请求能省一次就省一次
     * Home 只发送一次 HTTP
     *    维护性较差 新增功能会改动到原有代码
     * 有选择的把部分 http 请求合并成一个
     *
     *    1、HTTP 请求数量
     *    2、HTTP 多少次数据库查询 join
     *    3、接口的灵活性、接口的可维护性 粒度
     *
     * Web 应用 缺点 IO  IO密集型 CPU密集型
     * @returns {Promise<void>}
     */
    getHomeLocationE() {
        return this.themes.find(t => t.name === Theme.locationE)
    }

    getHomeLocationF() {
        return this.themes.find(t => t.name === Theme.locationF)
    }

    getHomeLocationH() {
        return this.themes.find(t => t.name === Theme.locationH)
    }

    static getHomeLocationESpu() {
        return Theme.getThemeSpuByName(Theme.locationE)
    }

    /**
     * 1、需要获取 theme 标题信息下面的 spu
     * 问题：那么这个方法需要在 home 中调用并且需要传入重复的参数（theme参数已在当前类中定义）
     * 如果需要获取 t-1 那么需要在调用方传入该参数, 项目中就会有多个 t-1
     * 优化：在当前 js 中封装方面 在当前页面中编写要获取指定 theme 下的 spu 信息
     * 2、是否需要加上 async await
     *    async 强制一个方法要返回 Promise
     * @param name
     * @returns {Promise<*>}
     */
    static getThemeSpuByName(name) {
        return Http.request({
            url: `theme/name/${name}/with_spu`
        })
    }
}

export {
    Theme
}